<?php
error_reporting(0);
/**
 * @函数: captcha()
 * @功能: 生成验证码，并受用户设置的数据控制
 * @参数: 验证码类型（数字，英文，混合），背景
 * @author yzg
 * @返回: 无
 */
function captcha($num_style = 3, $bg_style = array())
{
	if(!isset($_SESSION))
	{
		session_start();
		header('Cache-control:private');
	}
	
	//生成随机字符
	if($num_style == 1){
		$min = 0;
		$max = 0;
	}else if($num_style == 2){
		$min = 1;
		$max = 1;
	}else if($num_style == 3){
		$min = 0;
		$max = 1;
	}
	
	//生成随机码
	for($i = 0; $i <4; $i++)
	{	
		$type = mt_rand($min, $max);
		switch($type)
		{
			case 0:
				$tmp = mt_rand(48, 57);		//数字
				break;
			case 1:
				$tmp = mt_rand(65, 90);		//大写字母
				break;
			case 2:
				$tmp = mt_rand(97, 122);	//小写字母
				break;
		}
		
		$ascii  = sprintf('%c', $tmp);
		if(in_array($ascii, array('L', 'I', 'O',  'B')))		//去除相似的
		{
			$arrFilp = array('A' => '', 'D' => '', '6' => '', 'C' => '',);
			$ascii = array_rand($arrFilp);
		}
		$ascii1 .= $ascii;
	}
	
	//生成验证码
	$code = $ascii1;
	$_SESSION['captcha_string'] = $code;
	//创建画板
	$img = imagecreatetruecolor(70, 25);
	$bg = imagecolorallocate($img, 249,251, 253);
	imagefilledrectangle($img, 0, 0, 70, 25, $bg);				//填充颜色
	
	//输出背景线
	if(in_array(1, $bg_style))	//干扰码类型1，即背景线
	{
		for($i = 0; $i <10; $i++)
		{
			$mtcolor = imagecolorallocate($img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
			imageline($img, mt_rand(0, 70), mt_rand(0, 25), mt_rand(0, 70), mt_rand(0, 25), $mtcolor);
		}
	}
	
	//输出噪点背景
	if(in_array(2, $bg_style))
	{
		for($i = 0; $i <100; $i++)
		{
			$mtcolor = imagecolorallocate($img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
			imagesetpixel($img, mt_rand(0, 70), mt_rand(0, 25), $mtcolor);
		}
	}
	
	//输出混合文本
	if(in_array(3, $bg_style))
	{
		$text = array('*','!','~','@','#','$','%','^','&','(',')','_','-','+','=',';');
		$text = array_flip($text);		//颠倒键值
		$text = array_rand($text, 8);	//随机取出
		
		for($i = 0; $i <8; $i++)
		{
			$mtcolor = imagecolorallocate($img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
			imagechar($img, mt_rand(1,2), mt_rand(1, 70), mt_rand(1, 25), $text[$i], $mtcolor);
		}
	}
	
	//生成验证码
	//输出字符
	if(file_exists('air_mitalic.ttf'))
	{
		for($i = 0; $i <4; $i++)
		{
			$mtcolor = imagecolorallocate($img, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
			imagettftext($img, 12, mt_rand(-20, 20), $i*15+5, 18, $mtcolor, 'air_mitalic.ttf', $code{$i});
		}
	}
	else
	{
		for($i = 0; $i <4; $i++)
		{
			$mtcolor = imagecolorallocate($img, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
			imagechar($img, mt_rand(5, 6), ($i+1)*10, 4, $code{$i}, $mtcolor);
		}
	}
	
	//根据mime类型设置
	header('Content-type:image/gif');
	imagegif($img);
	imagedestroy($img);
}
captcha(0, array(1,2,3));	//生成图片
?>